package com.itheima.health.service.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.itheima.health.dao.MenuDao;
import com.itheima.health.entity.PageResult;
import com.itheima.health.entity.QueryPageBean;
import com.itheima.health.exception.HealthException;
import com.itheima.health.pojo.Menu;
import com.itheima.health.service.MenuService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author zhangxiaosheng
 * @date 2020/9/4 - 10:28
 */
@Service (interfaceClass = MenuService.class)
public class MenuServiceImpl implements MenuService {
    @Autowired
    private MenuDao menuDao;

    /**
     * 查询父菜单信息
     *
     * @return
     */
    @Override
    public List<Menu> findParentMenu() {
        return menuDao.findParentMenu();
    }

    /**
     * 添加菜单
     *
     * @param menu
     */
    @Override
    public void addMenu(Menu menu, Integer[] parentMenuIds) throws HealthException {
        if (parentMenuIds.length > 1) {
            throw new HealthException("只能有一个父菜单,请重新选择");
        }
        //    判断是子菜单还是父菜单

        if (parentMenuIds.length == 0) {
            //    父菜单
            //    查询最后一条父菜单,并给父菜单进行赋值
            Menu lastParentMenu = menuDao.findLastParentMenu();
            menu.setPath(Integer.valueOf(lastParentMenu.getPath()) + 1+"");
            menu.setPriority(lastParentMenu.getPriority() + 1);
            menu.setLevel(1);
        } else {
            //    子菜单
            //    查询其父菜单下的最后一条子菜单,并给子菜单赋值
            for (Integer parentMenuId : parentMenuIds) {
                Menu currentParentMenu = menuDao.findCurrentParentMenu(parentMenuId);
                Menu lastChildrenMenu = menuDao.findLastChildrenMenu(parentMenuId);
                if(lastChildrenMenu==null){
                    //第一个子菜单
                    menu.setPath("/" + currentParentMenu.getPath() + "-"+1);
                    menu.setPriority(1);
                }else{
                    menu.setPath("/" + currentParentMenu.getPath() + "-" + (lastChildrenMenu.getPriority() + 1));
                    menu.setPriority(lastChildrenMenu.getPriority() + 1);
                }
                menu.setLevel(2);
                menu.setParentMenuId(parentMenuId);
            }
        }
        //    添加菜单
        menuDao.addMenu(menu);
    }

    /**
     * 分页查询
     * @param queryPageBean
     * @return
     */
    @Override
    public PageResult<Menu> findPage(QueryPageBean queryPageBean) {
        PageHelper.startPage(queryPageBean.getCurrentPage(), queryPageBean.getPageSize());
        if (!StringUtils.isEmpty(queryPageBean.getQueryString())) {
            //    有条件
            queryPageBean.setQueryString("%" + queryPageBean.getQueryString() + "%");
        }
        Page<Menu> page = menuDao.findByCondition(queryPageBean.getQueryString());
        return new PageResult<>(page.getTotal(), page.getResult());
    }

    /**
     * 删除菜单
     *
     * @param id
     */
    @Override
    public void deleteMenu(int id) throws HealthException {
        //    判断是子菜单还是父菜单
        Menu menu = menuDao.findById(id);
        Integer level = menu.getLevel();
        if (level == 1) {
            //    父菜单,判断其是否有子菜单
            int childrenMenuCount = menuDao.findchildrenMenuCount(id);
            if (childrenMenuCount > 0) {
                //    有子菜单,不能删除
                throw new HealthException("该父菜单有子菜单,不能删除");
            }
        }
        //    判断是否被角色使用
        int roleMenuCount = menuDao.findRoleMenuCount(id);
        if (roleMenuCount > 0) {
            //    角色有菜单,不能删除
            throw new HealthException("角色有该菜单,不能删除");
        }
        menuDao.deleteMenu(id);
        //    都没有，进行删除

    }

    /**
     * 查询所有
     *
     * @return
     */
    @Override
    public List<Menu> findAll() {
        return menuDao.findAll();
    }

    /**
     * 回显数据
     * @param id
     * @return
     */
    @Override
    public Menu findById(int id) {
        return menuDao.findById(id);
    }

    /**
     * 父菜单id
     * @param id
     * @return
     */
    @Override
    public Integer findParentId(int id) {
       return menuDao.findById(id).getParentMenuId();
    }

    /**
     * 编辑菜单
     * @param menu
     */
    @Override
    public void update(Menu menu) {
        menuDao.update(menu);
    }
}
